#include "sql_mcdefine.h"
#include <QJsonValue>



Sql_MCDefine::Sql_MCDefine()
{
    //建立和sqlite数据的连接
    db = QSqlDatabase::addDatabase("QSQLITE", QString("connection1"));
    //设置数据库文件的名字
    db.setDatabaseName(QString("../EXC_SQL/EXC_MC_DEFINE.db"));

    OpenDb();
}

Sql_MCDefine::~Sql_MCDefine()
{
    CloseDb();
}

bool Sql_MCDefine::OpenDb()
{
    //打开数据库
    if(db.open() == false){
#ifdef _SQL_DEBUG_PRINT_
        qDebug() << "连接define数据失败！";
#endif
        return false;
    }
#ifdef _SQL_DEBUG_PRINT_
    qDebug() << "连接define数据库成功";
#endif
    return true;
}

void Sql_MCDefine::CloseDb()
{
    db.close();
    qDebug() << "define数据库close";
}

//function:一个demo，用于初始化时查看数据库是否能读取
void Sql_MCDefine::QueryTable()
{
    QSqlQuery query(db);
    //构建创建数据库的sql语句字符串
    QString str = QString("SELECT function FROM 调节器状态 WHERE bit='1'");
    //执行sql语句,并将结果集保存到model
    if(query.exec(str)==false){
#ifdef _SQL_DEBUG_PRINT_
        qDebug() << "define数据库read error";
#endif
        return;
    }

#ifdef _SQL_DEBUG_PRINT_
    qDebug() << "define数据库read";
#endif
    while(query.next())
    {
#ifdef _CPP_DEBUG_PRINT_
        qDebug() << query.value(0).toString();
#endif
    }
}

//function:执行一个语句，只返回第一个参数
//i_str:SQL语句
QJsonValue Sql_MCDefine::qml_queryTableOnce(QString i_str)
{
    QSqlQuery query(db);
    //执行sql语句,并将结果集保存到model
    if(query.exec(i_str)==false){
#ifdef _SQL_DEBUG_PRINT_
        qDebug() << "查询数据库EXC_MC_DEFINESQL语句:" << i_str
                 << "SQL错误::表达式错误";
#endif
        return QJsonValue(QString("NULL"));
    }
    query.next();
#ifdef _SQL_DEBUG_PRINT_
    qDebug() << "查询数据库EXC_MC_DEFINE SQL语句:" << i_str
             << "SQL结果" << query.value(0);
#endif
    return QJsonValue(query.value(0).toString());
}

QVariant Sql_MCDefine::cpp_queryTableOne(QString i_str)
{
    QSqlQuery query(db);
    //执行sql语句,并将结果集保存到model
    if(query.exec(i_str)==false){
#ifdef _SQL_DEBUG_PRINT_
        qDebug() << "查询数据库EXC_MC_DEFINESQL语句:" << i_str
                 << "SQL错误::表达式错误";
#endif
        return QString("");
    }
    if(query.next())
    {
#ifdef _SQL_DEBUG_PRINT_
        qDebug() << "查询数据库EXC_MC_DEFINE SQL语句:" << i_str
                 << "SQL结果" << query.value(0);
#endif
        return query.value(0);
    }
    else
    {
#ifdef _SQL_DEBUG_PRINT_
        qDebug() << "查询数据库EXC_MC_DEFINE SQL语句:" << i_str
                 << "SQL结果" << "无结果！！！";
#endif
        return 0;
    }
}

QVector<QString> Sql_MCDefine::qml_queryTableManyRetVec(QString i_str)
{
    QVector<QString> t_vec;
    QSqlQuery query(db);
    //执行sql语句,并将结果集保存到model
    if(query.exec(i_str)==false){
#ifdef _SQL_DEBUG_PRINT_
        qDebug() << "查询数据库EXC_MC_DEFINESQL语句:" << i_str
                 << "SQL错误::表达式错误";
#endif
        return t_vec;
    }
    while(query.next())
    {
        t_vec.push_back(query.value(0).toString());
    }
#ifdef _SQL_DEBUG_PRINT_
    qDebug() << "查询数据库EXC_MC_DEFINESQL语句:" << i_str
             << " SQL结果:" << t_vec;
#endif
    return t_vec;
}

bool Sql_MCDefine::cpp_queryTable2D(QString i_str, QVector<QVector<QVariant>> &o_vec)
{
    QSqlQuery query(db);
    o_vec.clear();
    if(query.exec(i_str)==false){
#ifdef _SQL_DEBUG_PRINT_
        qDebug() << "查询数据库EXC_MC_DEFINESQL语句:" << i_str
                 << "SQL错误::表达式错误";
#endif
        return false;
    }
    while(query.next())
    {
        QVector<QVariant> t_qverQstring;
        for(int t_counter=0; (query.value(t_counter).toString()!=NULL); t_counter++){
            t_qverQstring.push_back(query.value(t_counter));
        }
        o_vec.push_back(t_qverQstring);
    }
#ifdef _SQL_DEBUG_PRINT_
    qDebug() << "查询数据库EXC_MC_DEFINE SQL语句:" << i_str
             << "SQL结果：二维数组：" << o_vec;
#endif
    return true;
}

QVector<QString> Sql_MCDefine::qml_queryTable2DRetVec1D(QString i_str)
{
    QVector<QString> t_retVal;
    QSqlQuery query(db);
    //执行sql语句,并将结果集保存到model
    if(query.exec(i_str)==false){
#ifdef _SQL_DEBUG_PRINT_
        qDebug() << "查询数据库EXC_MC_DEFINE SQL语句:" << i_str
                 << "SQL错误:表达式错误";
#endif
        return t_retVal;
    }
    while(query.next())
    {
        for(int t_counter=0; (query.value(t_counter).toString()!=NULL); t_counter++){
            t_retVal.push_back(query.value(t_counter).toString());
        }
    }
#ifdef _SQL_DEBUG_PRINT_
    qDebug() << "查询数据库EXC_MC_RECORDER SQL语句:" << i_str
             << "SQL结果:2D，第一个是:" << t_retVal;
#endif
    return t_retVal;

}


//function：查询状态量
//introdution：支持从表定义重复，主表define列定义重复报错
//传入参数：
//i_prefixion-前缀名，如A套、1#，无编号放空，如灭磁柜故障
//i_tableName-表名，如调节器状态
//i_function-位作用名，如本通道运行
//返回值：失败 -1 ；成功 找到的个数
//o_dec:dec值，用于recorder中查询
//o_bit:bit值，用于判断该位是否为0
int Sql_MCDefine::cpp_getBitDec(QString i_prefixion, QString i_tableName, QString i_function,
                                QVector<int> &o_dec, QVector<int> &o_bit)
{
    QVector<QVector<QVariant>> t_vec;
    //1-寻找从表定义，bit、reg
    if(cpp_queryTable2D(QString("select reg,bit from %1 where function='%2'").arg(i_tableName).arg(i_function), t_vec)==false)
        return -1;  //error 1:表达式错误
    if(t_vec.size()<=0){
#ifdef _SQL_DEBUG_PRINT_
        qDebug() << "->找不到任何结果";
#endif
        return -2;  //error 2:没找到任何结果
    }
    //1.2-获取bit、reg
    QVector<QString> t_reg;
    for(int i=0; i<t_vec.size(); i++){
        t_reg.push_back(t_vec.at(i).at(0).toString());
        o_bit.push_back(t_vec.at(i).at(1).toInt());
    }

    //2-寻找主表hex，%1前缀，%2上面得到的define(reg)
    t_vec.clear();
    for(int i=0;i<t_reg.size();i++){
        if(cpp_queryTable2D(QString("select dec from mc_define where define='%1%2'").arg(i_prefixion).arg(t_reg.at(i)), t_vec)==false)
            return -1;  //error 1:表达式错误
        o_dec.push_back(t_vec.at(0).at(0).toInt());
#ifdef _SQL_DEBUG_PRINT_
        if(t_vec.size()>1)
            qDebug() << "->主表定义重复";
#endif
    }
    return t_reg.size();
}

QJsonValue Sql_MCDefine::qml_queryTableRegDef(QString i_str)
{
    return qml_queryTableOnce(QString("SELECT dec FROM reg_define WHERE define=\'%1\'").arg(i_str));
}

QJsonValue Sql_MCDefine::qml_queryTableMcDef(QString i_str)
{
    return qml_queryTableOnce(QString("SELECT dec FROM mc_define WHERE define=\'%1\'").arg(i_str));
}

QJsonValue Sql_MCDefine::qml_queryTableWriteDef(QString i_str)
{
    return qml_queryTableOnce(QString("SELECT dec FROM 写命令 WHERE define=\'%1\'").arg(i_str));
}
